/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Ventas;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

import javax.swing.table.DefaultTableModel;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
 *
 * @author nan
 */
public class MedVenta implements ActionListener, KeyListener{
    private GUIVenta unaVent = new GUIVenta();
    private Conexion.ConexionBD conectar = new Conexion.ConexionBD();
    String[] titulos = {"Cod", "Nombre", "Marca", "Descrip", "Cantidad", "$ Costo","$  Sub Total"};
    Object[][] datos = {};
    private DefaultTableModel dtmArticulos;
    private double total = 0;
    private int cantidad = 0;
    private double inicio = 0;
    private String tipopago;
    private String nombreUser;
    private boolean bandera = false;
    private Administracion.AdministracionMediador admin;
    private double porsentaje = 0;

    public MedVenta(String nombreuser,Administracion.AdministracionMediador a){
        unaVent.setLocationRelativeTo(null);
        unaVent.getjTextFieldCodigo().addKeyListener(new PresionarTecla());
        unaVent.getjTextFieldCodigo().setEnabled(bandera);
        unaVent.getjButtonSeleccion().setEnabled(bandera);
        unaVent.getjButtonEliminar().setEnabled(bandera);
        unaVent.getjButtonComprar().setEnabled(bandera);
        unaVent.getjTextFieldCodigo().setEnabled(bandera);
        unaVent.getjTextPaneTotal().setText("");
        unaVent.getjButtonBuascar().setEnabled(false);
        unaVent.getjTextFieldcodigoDev().setEnabled(false);
        unaVent.getjTextFieldcodigoDev().setText("");
        unaVent.getjButtonUsarDev().setEnabled(false);
        admin = a;
        this.nombreUser = nombreuser;
        dtmArticulos = new DefaultTableModel(datos, titulos);
        this.actualizarFecha();
        unaVent.setActionListeners(this);
        unaVent.setKeyListener(this);
        unaVent.show();
    }

    public void setVisible(boolean mostrar){
        getUnaVent().setVisible(mostrar);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==getUnaVent().getjRadioButtonContado()){
            setTipopago("Contado");
            bandera = true;
            getUnaVent().getjRadioButtonTargeta().setEnabled(false);
            getUnaVent().getjButtonSeleccion().setEnabled(bandera);
            getUnaVent().getjButtonEliminar().setEnabled(bandera);
            getUnaVent().getjButtonComprar().setEnabled(bandera);
            getUnaVent().getjTextFieldCodigo().setEditable(bandera);
            getUnaVent().getjTextFieldCodigo().grabFocus();
            getUnaVent().getjTextFieldCodigo().setEnabled(bandera);
            getUnaVent().getjRadioButtonDevolucion().setEnabled(false);

            
        }
        if (e.getSource()==getUnaVent().getjRadioButtonTargeta()){
            setTipopago("Tarjeta");
            bandera = true;
            getUnaVent().getjRadioButtonContado().setEnabled(false);
            getUnaVent().getjButtonSeleccion().setEnabled(bandera);
            getUnaVent().getjButtonEliminar().setEnabled(bandera);
            getUnaVent().getjButtonComprar().setEnabled(bandera);
            getUnaVent().getjTextFieldCodigo().setEditable(bandera);
            getUnaVent().getjTextFieldCodigo().grabFocus();
            getUnaVent().getjTextFieldCodigo().setEnabled(bandera);
            getUnaVent().getjRadioButtonDevolucion().setEnabled(false);
        }
        if(e.getSource()==getUnaVent().getjButtonSeleccion()){
            buscarCampo(getUnaVent().getjTextFieldCodigo().getText());
            this.actualizartexTotal(inicio);
            getUnaVent().getjTextFieldCodigo().setText("");
        }
        if (e.getSource()==getUnaVent().getjButtonEliminar()){
            int select = getUnaVent().getjTableSeleccionados().getSelectedRow();
            if (select != -1){
                dtmArticulos.removeRow(select);
                this.actualizartexTotal(inicio);
            } else {
                JOptionPane.showMessageDialog(null, "Debe seleccionar un elemento", "Error por seleccion nula", JOptionPane.ERROR_MESSAGE);
            }
        }
        if (e.getSource()== getUnaVent().getjButtonComprar()){
            realizarVenta();
            getUnaVent().dispose();
            getUnaVent().getjTextFieldCodigo().setText("");
            bandera = false;
            admin.ActualizarConStocMin();
            cantidad = 0;
            total = 0;
            setTipopago("");
            porsentaje = 0;
            getUnaVent().getButtonGroup1().clearSelection();
            unaVent.getjRadioButtonDevolucion().setEnabled(true);
            getUnaVent().getjRadioButtonTargeta().setEnabled(true);
            getUnaVent().getjRadioButtonContado().setEnabled(true);
            getUnaVent().getjButtonSeleccion().setEnabled(bandera);
            getUnaVent().getjButtonEliminar().setEnabled(bandera);
            getUnaVent().getjButtonComprar().setEnabled(bandera);
            getUnaVent().getjTextFieldCodigo().setEnabled(bandera);
            inicio=0;

        }
        if (e.getSource()==getUnaVent().getjButtonCancelar()){
            getUnaVent().dispose();
            getUnaVent().getjTextFieldCodigo().setText("");
            bandera = false;
            admin.ActualizarConStocMin();
            cantidad = 0;
            total = 0;
            setTipopago("");
            porsentaje =0;
            getUnaVent().getButtonGroup1().clearSelection();
            unaVent.getjRadioButtonDevolucion().setEnabled(true);
            getUnaVent().getjRadioButtonTargeta().setEnabled(true);
            getUnaVent().getjRadioButtonContado().setEnabled(true);
            getUnaVent().getjButtonSeleccion().setEnabled(bandera);
            getUnaVent().getjButtonEliminar().setEnabled(bandera);
            getUnaVent().getjButtonComprar().setEnabled(bandera);
            getUnaVent().getjTextFieldCodigo().setEnabled(bandera);
            dtmArticulos = new DefaultTableModel(datos, titulos);
            unaVent.getjTableSeleccionados().setModel(dtmArticulos);
            inicio=0;
            unaVent.getjLabelFechaDev().setText("-------");
            unaVent.getjLabelMontoDev().setText("-------");
            unaVent.getjLabelTipoPago().setText("-------");
            unaVent.getjLabelcodigodev().setText("-------");
            unaVent.getjLabelUsuario().setText("-------");
            unaVent.getjTextFieldcodigoDev().setText("");
            unaVent.getjButtonBuascar().setEnabled(bandera);
            unaVent.getjButtonUsarDev().setEnabled(bandera);
            unaVent.getjTextFieldcodigoDev().setEnabled(bandera);

        }
        if (e.getSource()==unaVent.getjRadioButtonDevolucion()){
            getUnaVent().getjRadioButtonTargeta().setEnabled(false);
            getUnaVent().getjRadioButtonContado().setEnabled(false);
            getUnaVent().getjButtonSeleccion().setEnabled(false);
            getUnaVent().getjButtonEliminar().setEnabled(false);
            getUnaVent().getjButtonComprar().setEnabled(false);
            getUnaVent().getjTextFieldCodigo().setEnabled(false);
            getUnaVent().getjButtonBuascar().setEnabled(true);
            getUnaVent().getjTextFieldcodigoDev().setEnabled(true);
            getUnaVent().getjTextFieldcodigoDev().setText("");
            getUnaVent().getjTextFieldcodigoDev().requestFocus(true);
        }
        if (e.getSource()==unaVent.getjButtonBuascar()){
            if(unaVent.getjTextFieldcodigoDev().getText().matches("")){
                JOptionPane.showMessageDialog(null, "Ingrese el codigo de devolucion", "Ingreso Nulo", JOptionPane.WARNING_MESSAGE);
            }else{
                if(buscar(unaVent.getjTextFieldcodigoDev().getText())){
                    unaVent.getjButtonEliminar().setEnabled(true);
                    unaVent.getjButtonSeleccion().setEnabled(true);
                    unaVent.getjButtonUsarDev().setEnabled(true);
                    unaVent.getjTextFieldCodigo().setEnabled(true);
                    unaVent.getjTextFieldCodigo().setEditable(true);
                    setInicio(Double.parseDouble(unaVent.getjLabelMontoDev().getText())*-1);
                    if(unaVent.getjLabelTipoPago().getText().matches("Contado")){
                        setTipopago("Contado");
                    }else{
                        setTipopago("Tarjeta");
                    }
                }else{
                    JOptionPane.showMessageDialog(null, "Ingrese codigo de devolucion corespondiente", "Codigo no existe", JOptionPane.WARNING_MESSAGE);
                }
            }
        }
        if(e.getSource()==unaVent.getjButtonUsarDev()){
            System.out.println("entre a devolucion");
            if(!unaVent.getjTextPaneTotal().getText().matches("")){
                if(Double.parseDouble(unaVent.getjTextPaneTotal().getText())>=0){
                    conectar.conectar();
                    int confirmado = JOptionPane.showConfirmDialog(null,"¿Está seguro que desea hacer la devolucion?", "iminar Articulo", JOptionPane.YES_NO_OPTION);
                    if (JOptionPane.OK_OPTION == confirmado){
                        try {
                            Statement st = conectar.getConn().createStatement();
                            String borrar = "DELETE FROM \"Devolucio\" WHERE \"IDDevolucion\" = "+unaVent.getjLabelcodigodev().getText()+";";
                            System.out.println(st.execute(borrar));
                            st.close();
                        } catch (Exception ex) {

                            ex.printStackTrace();
                        }
                        realizarVenta();
                        getUnaVent().getjTextFieldCodigo().setText("");
                        bandera = false;
                        admin.ActualizarConStocMin();
                        cantidad = 0;
                        total = 0;
                        setTipopago("");
                        porsentaje = 0;
                        getUnaVent().getButtonGroup1().clearSelection();
                        getUnaVent().getjRadioButtonTargeta().setEnabled(true);
                        getUnaVent().getjRadioButtonContado().setEnabled(true);
                        getUnaVent().getjButtonSeleccion().setEnabled(bandera);
                        getUnaVent().getjButtonEliminar().setEnabled(bandera);
                        getUnaVent().getjButtonComprar().setEnabled(bandera);
                        getUnaVent().getjTextFieldCodigo().setEnabled(bandera);
                        inicio=0;
                        conectar.cerrar();
                        unaVent.getjLabelFechaDev().setText("-------");
                        unaVent.getjLabelMontoDev().setText("-------");
                        unaVent.getjLabelTipoPago().setText("-------");
                        unaVent.getjLabelcodigodev().setText("-------");
                        unaVent.getjLabelUsuario().setText("-------");
                        unaVent.getjTextFieldcodigoDev().setText("");
                        unaVent.getjButtonBuascar().setEnabled(bandera);
                        unaVent.getjButtonUsarDev().setEnabled(bandera);
                        unaVent.getjTextFieldcodigoDev().setEnabled(bandera);
                        unaVent.dispose();
                    }
                }else{
                    JOptionPane.showMessageDialog(null, "El total de venta tiene que ser mayor a 0", "Total Negativo", JOptionPane.WARNING_MESSAGE);
                }
            }else{
                JOptionPane.showMessageDialog(null, "Como minimo tiene que seleccionar una Articulo", "Seleccion nula", JOptionPane.WARNING_MESSAGE);
            }

        }

    }


    public boolean buscar(String codigo){
        conectar.conectar();
        Statement st;
        boolean bien = false;
        try {
            st = conectar.getConn().createStatement();
            String consulta = "SELECT \"IDDevolucion\", \"Total\", \"Fecha\", \"TipoPago\", \"Usuario\" FROM \"Devolucio\" WHERE \"IDDevolucion\"="+codigo+";" ;
            ResultSet rs = st.executeQuery(consulta);
            String id = null;
            while (rs.next()){
                unaVent.getjLabelcodigodev().setText(codigo);
                unaVent.getjLabelFechaDev().setText(rs.getString("Fecha"));
                unaVent.getjLabelMontoDev().setText(rs.getString("Total"));
                unaVent.getjLabelUsuario().setText(rs.getString("Usuario"));
                unaVent.getjLabelTipoPago().setText(rs.getString("TipoPago"));
                bien = true;
            }

        } catch (Exception e){
            bien = false;
            e.printStackTrace();
        }
        conectar.cerrar();
        return bien;
    }

    public void actualizartexTotal(double a){
        int i = 0;
        total = a;
        cantidad = 0;
        while (i<getUnaVent().getjTableSeleccionados().getRowCount()){
            total = total + Double.parseDouble(getUnaVent().getjTableSeleccionados().getValueAt(i, 6).toString());
            cantidad = cantidad + Integer.parseInt(getUnaVent().getjTableSeleccionados().getValueAt(i, 4).toString());
            i = i +1;
        }
        getUnaVent().getjTextPaneTotal().setText(total+"");
    }

    public void actualizarFecha() {
        try {
            getUnaVent().getjTextPaneFecha().setText(Date.class.newInstance().toLocaleString());
        } catch (InstantiationException ex) {
            Logger.getLogger(MedVenta.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(MedVenta.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void realizarVenta(){
        if(-1 == (getUnaVent().getjTableSeleccionados().getRowCount()-1)){
            JOptionPane.showMessageDialog(null, "NO Se ha realizado una venta", "Seleccion nula", JOptionPane.WARNING_MESSAGE);
            unaVent.getjRadioButtonDevolucion().setEnabled(true);
        }else{
            Statement st;
            conectar.conectar();
            try {
                    st = conectar.getConn().createStatement();
                    String consulta = "SELECT Max(\"IDVenta\") FROM \"Ventas\";";
                    String insertar;
                    ResultSet rs = st.executeQuery(consulta);
                    String in = "";
                    while (rs.next()){
                        in = rs.getString(1);
                    }

                    int a = Integer.parseInt(in)+1;
                    String aa = Double.toString(total);
                    int b = cantidad;
                    String c = getUnaVent().getjTextPaneFecha().getText();
                    String d = getTipopago();//tipo de pago
                    String ee = nombreUser;//poner usuario de turno
                    insertar = "INSERT INTO \"Ventas\"(\"IDVenta\", \"Total\", \"CantArticulo\", \"Fecha\", \"TipoPago\", \"Usuario\") VALUES ("+a+","+aa+","+b+",'"+c+"','"+d+"','"+ee+"')";
                    st.execute(insertar);
                    //--------------------------------------------------------
                    int i = getUnaVent().getjTableSeleccionados().getRowCount()-1;

                    while (i>=0){
                        String raa = getUnaVent().getjTableSeleccionados().getValueAt(i, 0).toString();
                        int can = Integer.parseInt(getUnaVent().getjTableSeleccionados().getValueAt(i, 4).toString());
                        descontarenBase(raa , can);
                        insertar = "INSERT INTO \"Facturacion\"(\"IDVentas\", \"CodigoArt\", \"Cant\") VALUES ("+a+", '"+raa+"',"+can+")";
                        st.execute(insertar);
                        dtmArticulos.removeRow(i);
                        i= i-1;
                    }
                    //--------------------------------------------------------
                    JOptionPane.showMessageDialog(null, "Se ha realizado una venta", "", JOptionPane.INFORMATION_MESSAGE);

            } catch (SQLException ex) {
                    ex.printStackTrace();
                    JOptionPane.showMessageDialog(null, "Nose puede realizar la venta", "ERROR", JOptionPane.ERROR_MESSAGE);
            }

            conectar.cerrar();
        }
    }

    public void descontarenBase(String cod , int cant){
        conectar.conectar();
        try {
            Statement st;
            st = conectar.getConn().createStatement();
            String consulta = "SELECT \"Stock\" FROM \"Articulo\" WHERE \"codArt\"='"+cod+"';";
            String insertar;
            ResultSet rs = st.executeQuery(consulta);
            String in = "";
            while (rs.next()){
                in = rs.getString(1);
            }
            int a = Integer.parseInt(in)-cant;
            String modifica = "UPDATE \"Articulo\" SET \"Stock\"="+a+" WHERE \"codArt\" = '"+cod+"';";
            st.execute(modifica);
            st.close();
        } catch (SQLException ex) {
                ex.printStackTrace();
                JOptionPane.showMessageDialog(null, "Nose pudo actualizar base de dato", "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        conectar.cerrar();
    }

    public void buscarCampo(String cod){
        conectar.conectar();
        Statement st;
        try {
            st = conectar.getConn().createStatement();
            String consulta = "SELECT * FROM \"Articulo\" WHERE \"codArt\" = '"+cod+"';" ;
            String consulta1 = "SELECT * FROM \"TipoPago\" WHERE \"Tipo\" = '"+getTipopago()+"';";
            ResultSet rs = st.executeQuery(consulta1);

            while (rs.next()){
                porsentaje = rs.getDouble(2);
            }
            rs = st.executeQuery(consulta);
            String id = null;

            if(cantidad==0){
               while (rs.next()){
                    Object[] fila = {rs.getString("codArt"),
                    rs.getString("nombre"),
                    rs.getString("marca"),
                    rs.getString("descripcion"),
                    1,
                    Math.rint(rs.getDouble("precioCosto")*porsentaje),
                    Math.rint(rs.getDouble("precioCosto")*porsentaje)};

                    if (hayStock(cod)==0){
                        JOptionPane.showMessageDialog(null, "No se puede vender este articulo", "Stoc en Cero", JOptionPane.WARNING_MESSAGE);
                    }else{
                        dtmArticulos.addRow(fila);
                        cantidad = 1;
                    }
                }
                
            }else{
                int ind = buscarcodTbl(cod,getUnaVent().getjTableSeleccionados().getRowCount()-1);
                System.out.println(ind);
                if(ind!=-1){
                    if (hayStock(cod)-Integer.parseInt(getUnaVent().getjTableSeleccionados().getValueAt(ind, 4).toString())==0){
                        JOptionPane.showMessageDialog(null, "No se puede vender este articulo", "Stoc en Cero", JOptionPane.WARNING_MESSAGE);
                    }else{
                        
                        getUnaVent().getjTableSeleccionados().setValueAt(Integer.parseInt(getUnaVent().getjTableSeleccionados().getValueAt(ind, 4).toString())+1, ind,4 );
                        getUnaVent().getjTableSeleccionados().setValueAt(Double.parseDouble(getUnaVent().getjTableSeleccionados().getValueAt(ind, 5).toString())*Integer.parseInt(getUnaVent().getjTableSeleccionados().getValueAt(ind, 4).toString()), ind,6 );
                    }
                }else{
                    System.out.println("entre");
                    while (rs.next()){
                        Object[] fila = {rs.getString("codArt"),
                        rs.getString("nombre"),
                        rs.getString("marca"),
                        rs.getString("descripcion"),
                        1,
                        Math.rint(rs.getDouble("precioCosto")*porsentaje),
                        Math.rint(rs.getDouble("precioCosto")*porsentaje)};
                        if (hayStock(cod)==0){
                            JOptionPane.showMessageDialog(null, "No se puede vender este articulo", "Stoc en Cero", JOptionPane.WARNING_MESSAGE);
                        }else{
                            dtmArticulos.addRow(fila);
                        }
                    }
                    
                }

            }
        } catch (Exception e){
            e.printStackTrace();
        }
        conectar.cerrar();
        getUnaVent().getjTableSeleccionados().setModel(dtmArticulos);
    }

    public int buscarcodTbl(String cod, int i){
        if (i==-1){
            return -1;
        }else{
            
            if (getUnaVent().getjTableSeleccionados().getValueAt(i, 0).toString().matches(cod)){
                System.out.println(getUnaVent().getjTableSeleccionados().getValueAt(i, 0).toString()+"-"+cod+"si"+i);
                return i;
            }else{
                System.out.println(getUnaVent().getjTableSeleccionados().getValueAt(i, 0).toString()+"-"+cod+"no"+i);
                return  + buscarcodTbl( cod, i-1);
            }
        }
    }

    public void keyTyped(KeyEvent e) {
        
        if (e.getSource()== getUnaVent().getjTextFieldCodigo()){
            char caracter = e.getKeyChar();
            if((caracter == '$')){
                e.consume();
            }
        }if (e.getSource()== unaVent.getjTextFieldcodigoDev()){
            char caracter = e.getKeyChar();
            if(caracter == KeyEvent.VK_ENTER){
                unaVent.getjButtonBuascar().doClick();
            }
            if(((caracter < '0') || (caracter > '9')) && (caracter != KeyEvent.VK_BACK_SPACE) ){
                e.consume();
            }
        }
        
    }

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }

    private int hayStock(String cod) {
        conectar.conectar();
        String in = "";
        try {
            Statement st;
            st = conectar.getConn().createStatement();
            String consulta = "SELECT \"Stock\" FROM \"Articulo\" WHERE \"codArt\"='"+cod+"';";
            String insertar;
            ResultSet rs = st.executeQuery(consulta);

            while (rs.next()){
                in = rs.getString(1);
            }
            st.close();
        } catch (SQLException ex) {
                ex.printStackTrace();
                JOptionPane.showMessageDialog(null, "error", "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        conectar.cerrar();
        return Integer.parseInt(in);
    }

    /**
     * @return the unaVent
     */
    public GUIVenta getUnaVent() {
        return unaVent;
    }

    /**
     * @return the tipopago
     */
    public String getTipopago() {
        return tipopago;
    }

    /**
     * @param tipopago the tipopago to set
     */
    public void setTipopago(String tipopago) {
        this.tipopago = tipopago;
    }

    public class PresionarTecla extends KeyAdapter {

      public void keyPressed(KeyEvent ke) {
          if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
              seleccionarArt(null);
          }
      }

        private void seleccionarArt(Object object) {
            buscarCampo(getUnaVent().getjTextFieldCodigo().getText());
            actualizartexTotal(inicio);
            getUnaVent().getjTextFieldCodigo().setText("");
        }




    }

    public void setInicio(double s){
        inicio=s;
    }
}
